//
// Created by Jisam on 2024/7/28 16:59.
// solve F - Range Connect MST
#include <bits/stdc++.h>

#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

using namespace std;

const int N = 1e5 + 5;
i64 ans;

struct DSU {
    vector<int> f, siz;

    DSU() {}

    DSU(int n) {
        init(n);
    }

    void init(int n) {
        f.resize(n);
        iota(f.begin(), f.end(), 0);
        siz.assign(n, 1);
    }

    int find(int x) {
        while (x != f[x]) {
            x = f[x] = f[f[x]];
        }
        return x;
    }

    bool same(int x, int y) {
        return find(x) == find(y);
    }

    bool merge(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) {
            return false;
        }
        siz[x] += siz[y];
        f[y] = x;
        return true;
    }

    int size(int x) {
        return siz[find(x)];
    }
};
/**
 * 解决一个关于连通分量的问题。
 * 使用动态骨骼树（DSU）数据结构来管理连通分量，并计算满足特定条件的最小成本。
 */
void solve() {
    /* n 表示整体的大小，q 表示查询的数量 */
    int n, q;
    cin >> n >> q;
    /* l, r, c 分别存储每个查询的左边界、右边界和成本 */
    vector<int> l(q), r(q), c(q);
    for (int i = 0; i < q; i++) {
        cin >> l[i] >> r[i] >> c[i];
        /* 将左边界减1以适应0索引 */
        l[i]--;
    }
    /* p 存储查询的索引，用于后续根据成本排序 */
    vector<int> p(q);
    iota(p.begin(), p.end(), 0);
    /* 根据成本对查询进行排序 */
    sort(p.begin(), p.end(), [&](int i, int j) {
        return c[i] < c[j];
    });
    /* dsu 是一个查并集，用于管理连通分量 */
    DSU dsu(n);
    /* ans 用于累计满足条件的成本 */
    i64 ans = 0;
    /* 遍历排序后的查询 */
    for (auto i : p) {
        /* 加上当前查询的成本 */
        ans += c[i];
        /* 从左边界开始，合并直到右边界前一个元素 */
        for (int x = dsu.find(l[i]); x < r[i] - 1; x = dsu.find(x)) {
            /* 合并相邻元素 */
            dsu.merge(x + 1, x);
            /* 再次加上当前查询的成本，因为合并了新的元素 */
            ans += c[i];
        }
    }
    /* 检查是否所有元素都连通，如果不是，则输出-1 */
    if (dsu.find(0) != n - 1) {
        cout << "-1\n";
    } else {
        /* 否则，输出累计的成本 */
        cout << ans << "\n";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
//    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}